/*
 * @Description: 泛型
 * @notes:
 * @Author:
 * @Date: 2024-03-24 18:57:49
 * @LastEditors: 郭火山 280118497@qq.com
 * @LastEditTime: 2024-03-25 20:48:42
 * @FilePath: \ts-learning\code\4-面向对象\src\8泛型.ts
 * @Description:
 */

// (function(){
// })();

// function fn(a: number): number {
//     return a;
// }

/**
 *  定义函数或是类时，如果遇到类型不明确就可以使用泛型
*/
function fn<T>(a: T): T {
    return a;
}

// 可以直接调用具有泛型的函数

let result = fn(10);// 不指定泛型 TS 可以自动对类型进行推断
// console.log('fn(10);', fn(10));
let result2 = fn<string>('hello');// 指定泛型

// 泛型可以同时指多个
function fn2<T, K>(a: T, b: K): T {
    console.log('a==', b);
    return a;
}
fn2(123, 'hello');
fn2<number, string>(123, 'hello');

interface Inter {
    length: number;
}

// T extends Inter 表示泛型 T 必须是 Inter 实现类(子类)
function fn3<T extends Inter>(a: T): number {
    return a.length
}
fn3('123');

class MyClass<T>{
    name: T;
    constructor(name: T) {
        this.name = name;
    }

}

const mc = new MyClass<string>('孙悟空');